package com.greentravel.util;

/**
 * 碳减排计算工具类
 * 用于计算不同出行方式的碳减排量和积分
 */
public class CarbonCalculator {

    // 骑行单车每公里碳减排量（kg）
    private static final double BIKE_CARBON_REDUCTION_PER_KM = 0.2;

    // 电动车每公里碳减排量（kg）
    private static final double ELECTRIC_BIKE_CARBON_REDUCTION_PER_KM = 0.15;

    // 公交每人次碳减排量（kg）
    private static final double BUS_CARBON_REDUCTION_PER_TRIP = 0.5;

    // 地铁每人次碳减排量（kg）
    private static final double SUBWAY_CARBON_REDUCTION_PER_TRIP = 0.6;

    // 步行每公里碳减排量（kg）
    private static final double WALK_CARBON_REDUCTION_PER_KM = 0.2;

    // 骑行单车每公里积分
    private static final int BIKE_POINTS_PER_KM = 1;

    // 电动车每公里积分
    private static final int ELECTRIC_BIKE_POINTS_PER_KM = 1;

    // 公交每次积分
    private static final int BUS_POINTS_PER_TRIP = 2;

    // 地铁每次积分
    private static final int SUBWAY_POINTS_PER_TRIP = 2;

    // 步行每公里积分
    private static final int WALK_POINTS_PER_KM = 2;

    /**
     * 计算碳减排量
     * 
     * @param travelMode 出行方式
     * @param distance   距离（公里）
     * @return 碳减排量（kg）
     */
    public static double calculateCarbonReduction(String travelMode, double distance) {
        switch (travelMode) {
            case "单车":
                return distance * BIKE_CARBON_REDUCTION_PER_KM;
            case "电动车":
                return distance * ELECTRIC_BIKE_CARBON_REDUCTION_PER_KM;
            case "公交":
                return BUS_CARBON_REDUCTION_PER_TRIP;
            case "地铁":
                return SUBWAY_CARBON_REDUCTION_PER_TRIP;
            case "步行":
                return distance * WALK_CARBON_REDUCTION_PER_KM;
            default:
                return 0;
        }
    }

    /**
     * 计算获得的积分
     * 
     * @param travelMode 出行方式
     * @param distance   距离（公里）
     * @return 积分
     */
    public static int calculatePoints(String travelMode, double distance) {
        switch (travelMode) {
            case "单车":
                return (int) Math.round(distance * BIKE_POINTS_PER_KM);
            case "电动车":
                return (int) Math.round(distance * ELECTRIC_BIKE_POINTS_PER_KM);
            case "公交":
                return BUS_POINTS_PER_TRIP;
            case "地铁":
                return SUBWAY_POINTS_PER_TRIP;
            case "步行":
                return (int) Math.round(distance * WALK_POINTS_PER_KM);
            default:
                return 0;
        }
    }

    /**
     * 计算相当于种植多少棵树
     * 
     * @param carbonReduction 碳减排量（kg）
     * @return 相当于种植的树木数量
     */
    public static double calculateEquivalentTrees(double carbonReduction) {
        // 假设一棵树每年吸收 22kg 二氧化碳
        return carbonReduction / 22.0;
    }

    /**
     * 计算相当于节省多少升汽油
     * 
     * @param carbonReduction 碳减排量（kg）
     * @return 相当于节省的汽油量（升）
     */
    public static double calculateEquivalentGasoline(double carbonReduction) {
        // 假设燃烧 1 升汽油产生 2.3kg 二氧化碳
        return carbonReduction / 2.3;
    }
}